package org.excilys.training.ebanking.service;

import java.util.ArrayList;
import java.util.List;

import org.excilys.training.ebanking.iservice.IDateProvider;
import org.excilys.training.ebanking.iservice.IDateProviderFactory;
import org.excilys.training.ebanking.model.Mois;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

@Service
public class DateProviderFactory implements IDateProviderFactory {
	List<String> nomMois;
	List<Mois> listMois;
	List<Integer> listAnnee;

	public IDateProvider createDateProvider(int moisDemande) {
		IDateProvider dateProvider = new DateProvider();
		dateProvider.setListAnnee(getAnneeProvider());
		dateProvider.setListMois(getMonthProvider(moisDemande));
		return dateProvider;
	}

	/**
	 * Créé une liste de mois formatés
	 * 
	 * @Param moisDemande mois en cours de l'année actuelle
	 * 
	 *        Retourne une liste de mois
	 * 
	 */
	public List<Mois> getMonthProvider(int moisDemande) {
		nomMois = new ArrayList<String>();
		listMois = new ArrayList<Mois>();
		initMois();
		createMois(moisDemande, 2011);

		return listMois;
	}

	/**
	 * Créé une liste d'année
	 */
	public List<Integer> getAnneeProvider() {
		listAnnee = new ArrayList<Integer>();
		initAnnee();
		return listAnnee;
	}

	private void initAnnee() {
		int annee = new DateTime().getYear();
		listAnnee.add(annee);
		listAnnee.add(annee - 1);
		listAnnee.add(annee - 2);
	}

	private void initMois() {
		nomMois.add("Jan");
		nomMois.add("Fev");
		nomMois.add("Mar");
		nomMois.add("Avr");
		nomMois.add("Mai");
		nomMois.add("Juin");
		nomMois.add("Juil");
		nomMois.add("Aout");
		nomMois.add("Sept");
		nomMois.add("Oct");
		nomMois.add("Nov");
		nomMois.add("Dec");

	}

	private void createMois(int moisdemande, int year) {
		int anneeCourante = new DateTime().getYear();

		if (year == anneeCourante)
			for (int i = 1; i < 13; i++) {
				if (i < moisdemande) {
					listMois.add(new Mois(i, nomMois.get(i - 1), false, true));
				}
				if (i == moisdemande) {
					listMois.add(new Mois(i, nomMois.get(i - 1), true, true));
				}
				if (i > moisdemande) {
					listMois.add(new Mois(i, nomMois.get(i - 1), false, false));
				}
			}
		else {
			for (int i = 1; i < 13; i++) {
				listMois.add(new Mois(i, nomMois.get(i - 1), false, true));
			}
		}
	}

	public List<String> getNomMois() {
		return nomMois;
	}

	public void setNomMois(List<String> nomMois) {
		this.nomMois = nomMois;
	}

	public List<Mois> getListMois() {
		return listMois;
	}

	public void setListMois(List<Mois> listMois) {
		this.listMois = listMois;
	}

	public String getLisMoisOfYear(int mois) {
		nomMois = new ArrayList<String>();
		initMois();
		return nomMois.get(mois - 1);
	}

}
